package com.caidan.search.controller;

import com.caidan.common.result.Result;
import com.caidan.common.result.ResultCodeEnum;
import com.caidan.search.config.AllowFileTypeProperties;
import com.caidan.search.config.MinioConstantProperties;
import com.caidan.search.utils.MinioUploadFileUtils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

@RestController
@RequestMapping("/file") // 路径映射
@Slf4j
public class FileController {
    @Resource
    private AllowFileTypeProperties allowFileTypeProperties; // 允许上传的文件类型配置
    @Autowired
    private MinioConstantProperties minioConstantProperties; // Minio相关配置
    @Resource
    private MinioUploadFileUtils minioUploadFileUtils;

    /**
     * 文件上传接口
     *
     * @param multipartFile 上传的文件
     * @return 上传结果
     */
    @PostMapping("/fileUpload")
    public Result fileUpload(@RequestParam("avatar") MultipartFile multipartFile) {
        // 检查上传文件是否为空
        if (multipartFile == null || multipartFile.isEmpty()) {
            return Result.fail(ResultCodeEnum.DATA_ERROR.getMessage());
        }
        // 检查配置是否正常加载
        if (allowFileTypeProperties == null || minioConstantProperties == null) {
            log.error("[fileUpload] Configuration beans not loaded properly.");
            return Result.fail("系统配置加载失败，请联系管理员");
        }
        // 调用方法检查文件是否合法
        if (!isFileAllowed(multipartFile)) {
            return Result.fail("文件类型或大小不符合要求");
        }
        // 文件上传逻辑
        try {
            // 示例：调用 Minio SDK 执行上传逻辑 (代码省略)
            String fileName = UUID.randomUUID().toString().replace("-","");
            String fileUrl = minioUploadFileUtils.uploadFile(fileName, multipartFile);
            return Result.ok(fileUrl);
        } catch (Exception e) {
            log.error("[fileUpload] Failed to upload file", e);
            return Result.fail("文件上传失败，请稍后再试");
        }
    }

    /**
     * 检查文件类型和大小是否合法
     *
     * @param file 上传的文件
     * @return 是否允许上传
     */
    private boolean isFileAllowed(MultipartFile file) {
        // 文件为空或无效直接返回 false
        if (file == null || file.isEmpty()) {
            return false;
        }
        // 获取文件名
        String fileName = file.getOriginalFilename();
        if (fileName == null || !fileName.contains(".")) {
            return false;
        }
        // 提取文件扩展名并转换为小写
        String fileFormat = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
        // 检查文件类型是否在允许列表中
        if (allowFileTypeProperties.getAllowFileType() == null ||
                !allowFileTypeProperties.getAllowFileType().contains(fileFormat)) {
            log.error("[isFileAllowed] Unsupported file type: {}, allowed: {}",
                    fileFormat, allowFileTypeProperties.getAllowFileType());
            return false;
        }
        // 检查文件大小是否超出限制
        if (1.0 * file.getSize() / (1024 * 1024) > allowFileTypeProperties.getMaxFileSize()) {
            log.error("[isFileAllowed] File size exceeds limit: {} bytes, allowed: {} bytes",
                    file.getSize(), allowFileTypeProperties.getMaxFileSize());
            return false;
        }
        return true;
    }
}
